package com.masiyi.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author masiyi
 * @Date 2023/11/10
 * @PackageName:com.masiyi.util
 * @ClassName: MyMybatisUtil
 * @Description: 工具类
 * @Version 1.0
 */
public class MyMybatisUtil {

    static final Pattern pattern = Pattern.compile("#\\{([^}]+)}");


    /**
     * 将 SQL 查询语句中的占位符替换为对象的属性值
     *
     * @param sql 原始的 SQL 查询语句
     * @param obj 包含属性值的对象
     * @return 替换占位符后的 SQL 查询语句
     */
    public static String replacePlaceholders(String sql, Object obj) {
        // 创建匹配器，用于匹配占位符
        Matcher matcher = pattern.matcher(sql);
        // 创建字符串缓冲区，用于存储替换后的结果
        StringBuffer sb = new StringBuffer();
        // 循环查找匹配的占位符
        while (matcher.find()) {
            // 获取占位符的名称
            String placeholder = matcher.group(1);
            // 获取占位符对应的属性值
            Object replacement = getPropertyValue(obj, placeholder);
            // 如果属性值不为空
            if (replacement != null) {
                if (replacement.getClass() == String.class && !((String) replacement).isEmpty()) {
                    // 如果属性值是字符串类型且非空，添加单引号
                    replacement = "'" + replacement + "'";
                } else {
                    // 将属性值转换为字符串
                    replacement = replacement.toString();
                }
                // 将匹配到的占位符替换为属性值，并将结果添加到字符串缓冲区
                matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement.toString()));
            }
        }
        // 将剩余的部分添加到字符串缓冲区
        matcher.appendTail(sb);
        return sb.toString();
    }

    /**
     * 获取对象的属性值
     *
     * @param obj          包含属性值的对象
     * @param propertyName 属性名
     * @return 属性值的字符串表示
     */
    public static Object getPropertyValue(Object obj, String propertyName) {
        try {
            // 根据属性名使用反射获取属性值
            Field field = obj.getClass().getDeclaredField(propertyName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将字符串的首字母大写
     *
     * @param str 输入字符串
     * @return 首字母大写后的字符串
     */
    public static String capitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);
    }

}
